🔮
JUnit - Parameterized Test
November 05, 2021
@ParameterizedTest 로 다양하게 테스트 해보기
@ParameterizedTest 다양한 파라미터로 테스트 할때 유용하게 사용됩니다.
5보다 작은 숫자 테스트
@Test
void isLessThan_5() {
assertThat(1).isLessThan(6);
assertThat(2).isLessThan(6);
assertThat(3).isLessThan(6);
assertThat(4).isLessThan(6);
assertThat(5).isLessThan(6);
}위 코드 처럼 6이하의 케이스를 테스트 하고싶다고 할때, 중복된 코드가 많이 발생하게 됩니다.
이러한 부분을 @ParameterizedTest 을 사용해서 리팩토링 해보겠습니다.
@ParameterizedTest
@ValueSource(ints = {1, 2, 3, 4, 5})
@DisplayName("5보다 작은 숫자 테스트")
void ValueSource_test(int expected) {
assertThat(expected).isLessThan(6);
}@ValueSource 를 활용해서 테스트가 진행될때 숫차적으로 (int expected) 인자로 부여되면서 진행됩니다.
ints 이 외에도 strings = {"1", "2", "3", "4", "5"} 등 다른타입도 적용가능합니다.
한개 이상의 인자를 사용하고 싶을때?
위 예제는 5보다 작은 숫자 테스트 였습니다.
그런데 {숫자}보다 작은 숫자 테스트 하고싶을때는 아래와 같은 방법을 사용 할 수 있습니다.
@ParameterizedTest
@CsvSource(value = {
"1,2", // number, expected
"20,30"
})
void csvSource(int number, int expected) {
assertThat(number).isLessThan(expected);
}@CsvSource 의 기본 구분자는 ","입니다.
만약 다른 구분자를 사용하고 싶을때는
@ParameterizedTest
@CsvSource(value = {
"1:2",
"20:30"
}, delimiter = ':')delimiter = ':' 를 통해 다른 구분자를 사용해서 분리 시킬수 있습니다.
Primitive type 타입 외 객체 부여하기
@MethodSource("{메소드 이름}") 을 사용하면 다양하게 인자를 사용할 수 있습니다.
class TestNumber {
private int number;
public TestNumber(int number) {
this.number = number;
}
public int getNumber() {
return number;
}
}
// TestNumber 를 인자로 사용해보겠습니다. @ParameterizedTest
@MethodSource("이것은_주입인자_메소드")
void MethodSource_test(TestNumber testNumber, int number) {
assertThat(testNumber.getNumber()).isEqualTo(number);
}
private static Stream<Arguments> 이것은_주입인자_메소드() {
return Stream.of(
Arguments.of(new TestNumber(1), 1),
Arguments.of(new TestNumber(2), 2),
Arguments.of(new TestNumber(3), 3)
);
}private static Stream<Arguments> 이것은_주입인자_메소드() { 메소드처럼 인자를 정의하고
@MethodSource("이것은_주입인자_메소드") 를 통해 메소드 이름을 정의하면,
Primitive type 말고도 다양하게 테스트 할 수 있습니다~